package jcdatabase;

import java.io.IOException;
import java.io.RandomAccessFile;

public class JCDataDefinition
{

    public JCDataDefinition(String s)
    {
        dataType = new int[100];
        dataLength = new int[100];
        columnName = new String[100];
        maximumInteger = new int[100];
        tableName = s;
        openDefinitionFile();
        cacheDataDefinition();
        closeDefinitionFile();
    }

    private void openDefinitionFile()
    {
        try
        {
            file = new RandomAccessFile(tableName + ".def", "r");
            if(file == null)
            {
                Debug.error("Cannot access " + tableName + ".def");
                //System.exit(1);
            }
        }
        catch(IOException ioexception)
        {
            Debug.error("Cannot access " + tableName + ".def");
            //System.exit(1);
        }
    }

    private void closeDefinitionFile()
    {
        try
        {
            file.close();
        }
        catch(IOException ioexception)
        {
            Debug.error("Cannot access " + tableName + ".def");
        }
    }

    private void cacheDataDefinition()
    {
        try
        {
            file.seek(0L);
            int i = 0;
            rowSizeInBytes = 0;
            while(file.getFilePointer() < file.length() - 1L)
            {
                String s = file.readLine();
                String as[] = breakSentenceIntoWords(s, " ");
                columnName[i] = as[1];
                if(as[0].equalsIgnoreCase("integer"))
                {
                    dataType[i] = 0;
                    dataLength[i] = 4;
                    if(as.length > 2 && as[2] != null && as[2].equalsIgnoreCase("autonumber"))
                        dataType[i] = 1;
                } else
                if(as[0].equalsIgnoreCase("float"))
                {
                    dataType[i] = 3;
                    dataLength[i] = 4;
                } else
                if(as[0].equalsIgnoreCase("string"))
                {
                    dataType[i] = 2;
                    if(as.length > 2)
                    {
                        dataLength[i] = Integer.parseInt(as[2]);
                    } else
                    {
                        Debug.error("Error in " + tableName + ".DEF: String length expected line " + (i + 1));
                        System.exit(1);
                    }
                } else
                {
                    Debug.error("Error: Unknown datatype '" + as[0] + "' in table " + tableName);
                    System.exit(1);
                }
                rowSizeInBytes += dataLength[i];
                if(++i > 100)
                {
                    Debug.error("Maximum number of columns exceeded in table " + tableName);
                    System.exit(1);
                }
            }
            numberOfColumns = i;
            for(int j = 0; j < numberOfColumns; j++)
                maximumInteger[j] = -1;

        }
        catch(IOException ioexception)
        {
            Debug.error("File error with " + tableName);
        }
    }

    public static String[] breakSentenceIntoWords(String s, String s1)
    {
        int i = 0;
        int j = s.length() + 1;
        String as[] = new String[j];
        for(int k = 0; k < j; k++)
            as[k] = "";

        for(int l = 0; l < s.length(); l++)
        {
            String s2 = s.substring(l, l + 1);
            if(s2.equals(s1))
                i++;
            else
                as[i] += s2;
        }

        String as1[] = new String[i + 1];
        for(int i1 = 0; i1 < i + 1; i1++)
            as1[i1] = as[i1];

        return as1;
    }

    private void printTableInformation()
    {
        Debug.println("Row length = " + rowSizeInBytes + " bytes");
        Debug.println("Number of columns = " + numberOfColumns);
        Debug.println("Column Information (column, length, datatype): ");
        for(int i = 0; i < numberOfColumns; i++)
            Debug.println("(" + i + ", " + dataLength[i] + ", " + dataType[i] + ") ");

    }

    final String dataDefinitionFileExtension = ".def";
    static final int INTEGER = 0;
    static final int AUTOINTEGER = 1;
    static final int STRING = 2;
    static final int FLOAT = 3;
    static final int maximumNumberOfColumns = 100;
    private RandomAccessFile file;
    public String tableName;
    public int numberOfColumns;
    int rowSizeInBytes;
    int dataType[];
    String columnName[];
    int dataLength[];
    int maximumInteger[];
}